Ugulama: Elmas
Elmas veri seti üzerinde veri temizleme, veri düzenleme, gerekli görülen fonksiyonların veri seti üzerinde kullanılması, tanımsal istatistikleri elde etme, görselleştirme uygulanmıştır.
Veri Seti kaggle üzerinden linki ile alınmıştır.
library("plotly")
library("tidyr")
library("tidyverse")
library("dplyr")
library("ggplot2")
library("psych")
library(scales)
elmas = ggplot2::diamonds
as_tibble(elmas)
Elmas veri setinin tamamı yukarıda gözükmektedir.
glimpse(elmas)
Rows: 53,940
Columns: 10
$ carat <dbl> 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23, 0.30, 0.23, 0.22, 0.31, 0.20, 0.32, 0.30~
$ cut <ord> Ideal, Premium, Good, Premium, Good, Very Good, Very Good, Very Good, Fair, Very Good, Good, Ideal, ~
$ color <ord> E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, J, J, I, E, H, J, J, G, I, J, D, F, F, F, E, E~
$ clarity <ord> SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, SI1, VS1, SI1, SI2, SI2, I1, SI2, SI1, SI1, SI1,~
$ depth <dbl> 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4, 64.0, 62.8, 60.4, 62.2, 60.2, 60.9, 62.0~
$ table <dbl> 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54, 62, 58, 54, 54, 56, 59, 56, 55, 57, 62, 62, ~
$ price <int> 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339, 340, 342, 344, 345, 345, 348, 351, 351, 351, ~
$ x <dbl> 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, 4.00, 4.25, 3.93, 3.88, 4.35, 3.79, 4.38, 4.31~
$ y <dbl> 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05, 4.28, 3.90, 3.84, 4.37, 3.75, 4.42, 4.34~
$ z <dbl> 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39, 2.73, 2.46, 2.33, 2.71, 2.27, 2.68, 2.68~
Elmas veri setindeki değişkenlerin türleri yukarıdaki gibidir.
describe(elmas$price,trim = 0.05,type=3)
Price(Fiyat) değişkeninin tanımlayıcı istatistikleri yukarıdaki tabloda gösterilmiştir.
Örnek verilecek olusa PRice(Fiyat) değişkeninin;
%5 kesilmiş ortalaması = 3470,84
Medyanı 2401
Çarpıklığı 1,62 ( Price değişkeni sağa çarğık denilebilir.)
Elmas verisini istatistikleri
names(elmas)
[1] "carat" "cut" "color" "clarity" "depth" "table" "price" "x" "y" "z"
Degisken isimleri
Dplyr Fonksiyonu ile işlemler
Select
Elmas verisiden clarity, depth, table ve price değişkenlerini getir?
select(elmas,clarity:price)
Elmas verisiden clarity, depth, table ve price degişkenleri dışındaki değişkenleri getir?
select(elmas,-(clarity:price))
Filter
Elmas veri setinde kesimi premium ve Very Good olanları getir?
filter(elmas, cut %in% c("Premium","Very Good"))
Elmas veri setinde table 60’dan az ver price 400’den fazla olanları getir?
filter(elmas,table < 60 & price > 400)
Arrange
Elmas verisetini price değişkenine göre küçükten büyüğe sırala.
arrange(elmas, price)
Elmas veri setinde cut, clarity ve table degiskenlerini table değişkenine göre küçükten büyüğe sırala.
arrange(select(elmas, cut, clarity,table), table)
Elmas veri setinde cut, clarity,price ve table degiskenlerini table değişkenine göre büyüğe küçükten sırala.
arrange(select(elmas,cut, clarity, price, table),desc(table))
Summarise
Elmas verisetinin gözlem sayısı, Cut, clarity ve Color kategori sayilarini ve ortalama table sayisini bulununz
summarise(elmas,GozlemSayisi=n(),
CutDestinasyonlari=n_distinct(cut),
ClarityDestinasyonlari= n_distinct(clarity),
ColorDestinasyonlari= n_distinct(color),
OrtalamaTable= mean(table, na.rm = T))
Pipe operatoru
Depth ve table değişkenleri icin depth<table kosulu altinda toplam table’lı bulun
elmas %>%
select(depth,table) %>%
filter(depth< table) %>%
summarise(genel_toplam = sum(table))
Ortalama carat miktarını bulunuz?
elmas %>% select(carat) %>% sum()
[1] 43040.87
Rengi J olan depthleri bulunuz?
head(elmas %>% select(color, depth) %>% filter(color=="J"))
Cut değişkenini kategorilere gore dagilimi
elmas %>% group_by(cut) %>% summarise(Adet=n())
Color degiskeninin kategorilere gore dagilimi
elmas %>% group_by(color) %>% summarise(Adet=n())
Cut degiskeninin kategorilere gore dagilimi
elmas %>% group_by(clarity) %>% summarise(Adet=n())
Cut ve Clarity degiskenlerini ikili dagilimi
elmas %>% group_by(cut, clarity) %>% summarise(Adet=n())
`summarise()` has grouped output by 'cut'. You can override using the `.groups` argument.
Grafikler
Point plot
ggplot(data=elmas)+ geom_point(mapping = aes(x=price,y=table,color=clarity))

Box Plot
ggplot(data=elmas)+geom_boxplot(mapping = aes(x=clarity, y=table, color=clarity))

ggplot(data=elmas)+geom_boxplot(mapping = aes(x=cut, y=table, color=cut))

ggplot(data=elmas)+geom_boxplot(mapping = aes(x=color, y=table, color=color))

Histogram
ggplot(diamonds,aes(x = cut, fill = cut)) +
geom_bar(aes(y = (..count..)))+ geom_text(aes(y=(..count..), vjust = -0.5, label = ifelse((..count..)== 0 ,"", scales::percent((..count..)/sum(..count..)))), stat = "count")+
labs( x = "Elmasların kesim türü",
y = "Frekanslar",
title = "Kesimlerine göre elmas türleri")

NA
ggplot(data=elmas,aes(x=price))+geom_histogram(aes(y=..density..),color="Black", fill="Blue")+geom_density()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data=elmas,aes(x=depth))+geom_histogram(aes(y=..density..),color="Black", fill="Red")+geom_density()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data=elmas,aes(x=carat))+geom_histogram(aes(y=..density..),color="Black", fill="Purple")+geom_density()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

ggplot(data=elmas)+ geom_bar(mapping = aes(x=cut, fill=clarity))

ggplot(data=elmas)+ geom_bar(mapping = aes(x=cut, fill=clarity),position = "fill")

Pasta Grafiği
ggplot(diamonds,aes(x = "", fill=clarity)) +
geom_bar(width = 1) +
coord_polar (theta="y")

ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = cut), show.legend = FALSE, width = 1) +
theme(aspect.ratio = 1) +
labs(x = NULL, y = NULL)+
coord_flip()+
coord_polar()
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

3D Plot
plot_ly(diamonds, x = ~carat, y = ~depth, z = ~table, color = ~color, colors = c('#BF382A', '#0C4B8E')) %>%
add_markers() %>%
layout(scene = list(xaxis = list(title = 'carat'),
yaxis = list(title = 'depth'),
zaxis = list(title = 'table')))
NA
NA
LS0tDQp0aXRsZTogIkVsbWFzIFZlcmlzaSDDnHplcmluZGUgVGFuxLFtbGF5xLFjxLEgxLBzdGF0aXN0aWtsZXIgdmUgR8O2cnNlbGxlxZ90aXJtZSINCmF1dGhvcjogIkdpdGh1YjogT3pndXJucnR0biINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsbWVzc2FnZSA9RikNCmBgYA0KDQojIyBVZ3VsYW1hOiBFbG1hcw0KDQpFbG1hcyB2ZXJpIHNldGkgw7x6ZXJpbmRlIHZlcmkgdGVtaXpsZW1lLCB2ZXJpIGTDvHplbmxlbWUsIGdlcmVrbGkgZ8O2csO8bGVuIGZvbmtzaXlvbmxhcsSxbiB2ZXJpIHNldGkgw7x6ZXJpbmRlIGt1bGxhbsSxbG1hc8SxLCB0YW7EsW1zYWwgaXN0YXRpc3Rpa2xlcmkgZWxkZSBldG1lLCBnw7Zyc2VsbGXFn3Rpcm1lIHV5Z3VsYW5txLHFn3TEsXIuDQoNClZlcmkgU2V0aSBrYWdnbGUgw7x6ZXJpbmRlbiBbbGlua2ldKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vc2hpdmFtMjUwMy9kaWFtb25kcykgaWxlIGFsxLFubcSxxZ90xLFyLg0KDQpgYGB7ciwgd2FybmluZz1GICwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoInBsb3RseSIpDQpsaWJyYXJ5KCJ0aWR5ciIpDQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSgiZHBseXIiKQ0KbGlicmFyeSgiZ2dwbG90MiIpDQpsaWJyYXJ5KCJwc3ljaCIpDQpsaWJyYXJ5KHNjYWxlcykNCmVsbWFzID0gZ2dwbG90Mjo6ZGlhbW9uZHMNCmBgYA0KDQpgYGB7cn0NCmFzX3RpYmJsZShlbG1hcykNCmBgYA0KDQpFbG1hcyB2ZXJpIHNldGluaW4gdGFtYW3EsSB5dWthcsSxZGEgZ8O2esO8a21la3RlZGlyLg0KDQpgYGB7cn0NCmdsaW1wc2UoZWxtYXMpDQpgYGANCg0KRWxtYXMgdmVyaSBzZXRpbmRla2kgZGXEn2nFn2tlbmxlcmluIHTDvHJsZXJpIHl1a2FyxLFkYWtpIGdpYmlkaXIuDQoNCmBgYHtyfQ0KZGVzY3JpYmUoZWxtYXMkcHJpY2UsdHJpbSA9IDAuMDUsdHlwZT0zKQ0KYGBgDQpQcmljZShGaXlhdCkgZGXEn2nFn2tlbmluaW4gdGFuxLFtbGF5xLFjxLEgaXN0YXRpc3Rpa2xlcmkgeXVrYXLEsWRha2kgdGFibG9kYSBnw7ZzdGVyaWxtacWfdGlyLiANCg0Kw5ZybmVrIHZlcmlsZWNlayBvbHVzYSBQUmljZShGaXlhdCkgZGXEn2nFn2tlbmluaW47DQoNCiogJTUga2VzaWxtacWfIG9ydGFsYW1hc8SxID0gMzQ3MCw4NA0KDQoqIE1lZHlhbsSxIDI0MDENCg0KKiDDh2FycMSxa2zEscSfxLEgMSw2MiAoIFByaWNlIGRlxJ9pxZ9rZW5pIHNhxJ9hIMOnYXLEn8SxayBkZW5pbGViaWxpci4pDQoNCg0KRWxtYXMgdmVyaXNpbmkgaXN0YXRpc3Rpa2xlcmkNCg0KYGBge3J9DQpuYW1lcyhlbG1hcykNCmBgYA0KDQpEZWdpc2tlbiBpc2ltbGVyaQ0KDQojIyBEcGx5ciBGb25rc2l5b251IGlsZSBpxZ9sZW1sZXINCg0KIyMjIFNlbGVjdA0KDQpFbG1hcyB2ZXJpc2lkZW4gY2xhcml0eSwgZGVwdGgsIHRhYmxlIHZlIHByaWNlIGRlxJ9pxZ9rZW5sZXJpbmkgZ2V0aXI/DQoNCmBgYHtyIH0NCnNlbGVjdChlbG1hcyxjbGFyaXR5OnByaWNlKQ0KYGBgDQoNCkVsbWFzIHZlcmlzaWRlbiBjbGFyaXR5LCBkZXB0aCwgdGFibGUgdmUgcHJpY2UgZGVnacWfa2VubGVyaSBkxLHFn8SxbmRha2kgZGXEn2nFn2tlbmxlcmkgZ2V0aXI/DQoNCmBgYHtyfQ0Kc2VsZWN0KGVsbWFzLC0oY2xhcml0eTpwcmljZSkpDQpgYGANCg0KIyMjIEZpbHRlcg0KDQpFbG1hcyB2ZXJpIHNldGluZGUga2VzaW1pIHByZW1pdW0gdmUgVmVyeSBHb29kIG9sYW5sYXLEsSBnZXRpcj8NCg0KYGBge3J9DQpmaWx0ZXIoZWxtYXMsIGN1dCAlaW4lIGMoIlByZW1pdW0iLCJWZXJ5IEdvb2QiKSkNCmBgYA0KDQpFbG1hcyB2ZXJpIHNldGluZGUgdGFibGUgNjAnZGFuIGF6IHZlciBwcmljZSA0MDAnZGVuIGZhemxhIG9sYW5sYXLEsSBnZXRpcj8NCg0KYGBge3J9DQpmaWx0ZXIoZWxtYXMsdGFibGUgPCA2MCAmIHByaWNlID4gNDAwKQ0KYGBgDQoNCiMjIyBBcnJhbmdlDQoNCkVsbWFzIHZlcmlzZXRpbmkgcHJpY2UgZGXEn2nFn2tlbmluZSBnw7ZyZSBrw7zDp8O8a3RlbiBiw7x5w7zEn2Ugc8SxcmFsYS4NCg0KYGBge3J9DQphcnJhbmdlKGVsbWFzLCBwcmljZSkNCmBgYA0KDQpFbG1hcyB2ZXJpIHNldGluZGUgY3V0LCBjbGFyaXR5IHZlIHRhYmxlIGRlZ2lza2VubGVyaW5pIHRhYmxlIGRlxJ9pxZ9rZW5pbmUgZ8O2cmUga8O8w6fDvGt0ZW4gYsO8ecO8xJ9lIHPEsXJhbGEuDQoNCmBgYHtyfQ0KYXJyYW5nZShzZWxlY3QoZWxtYXMsIGN1dCwgY2xhcml0eSx0YWJsZSksIHRhYmxlKQ0KYGBgDQoNCkVsbWFzIHZlcmkgc2V0aW5kZSBjdXQsIGNsYXJpdHkscHJpY2UgdmUgdGFibGUgZGVnaXNrZW5sZXJpbmkgdGFibGUgZGXEn2nFn2tlbmluZSBnw7ZyZSBiw7x5w7zEn2Uga8O8w6fDvGt0ZW4gc8SxcmFsYS4NCg0KYGBge3J9DQphcnJhbmdlKHNlbGVjdChlbG1hcyxjdXQsIGNsYXJpdHksIHByaWNlLCB0YWJsZSksZGVzYyh0YWJsZSkpDQpgYGANCg0KIyMjIFN1bW1hcmlzZQ0KDQpFbG1hcyB2ZXJpc2V0aW5pbiBnw7Z6bGVtIHNhecSxc8SxLCBDdXQsIGNsYXJpdHkgdmUgQ29sb3Iga2F0ZWdvcmkgc2F5aWxhcmluaSB2ZSBvcnRhbGFtYSB0YWJsZSBzYXlpc2luaSBidWx1bnVueg0KDQpgYGB7cn0NCnN1bW1hcmlzZShlbG1hcyxHb3psZW1TYXlpc2k9bigpLA0KICAgICAgICAgIEN1dERlc3RpbmFzeW9ubGFyaT1uX2Rpc3RpbmN0KGN1dCksDQogICAgICAgICAgQ2xhcml0eURlc3RpbmFzeW9ubGFyaT0gbl9kaXN0aW5jdChjbGFyaXR5KSwNCiAgICAgICAgICBDb2xvckRlc3RpbmFzeW9ubGFyaT0gbl9kaXN0aW5jdChjb2xvciksDQogICAgICAgICAgT3J0YWxhbWFUYWJsZT0gbWVhbih0YWJsZSwgbmEucm0gPSBUKSkNCmBgYA0KDQojIyMgUGlwZSBvcGVyYXRvcnUNCg0KRGVwdGggdmUgdGFibGUgZGXEn2nFn2tlbmxlcmkgaWNpbiBkZXB0aFw8dGFibGUga29zdWx1IGFsdGluZGEgdG9wbGFtIHRhYmxlJ2zEsSBidWx1bg0KDQpgYGB7cn0NCmVsbWFzICU+JSANCiAgc2VsZWN0KGRlcHRoLHRhYmxlKSAlPiUgDQogIGZpbHRlcihkZXB0aDwgdGFibGUpICU+JSANCiAgc3VtbWFyaXNlKGdlbmVsX3RvcGxhbSA9IHN1bSh0YWJsZSkpDQpgYGANCg0KT3J0YWxhbWEgY2FyYXQgbWlrdGFyxLFuxLEgYnVsdW51ej8NCg0KYGBge3J9DQplbG1hcyAlPiUgc2VsZWN0KGNhcmF0KSAlPiUgc3VtKCkNCmBgYA0KDQpSZW5naSBKIG9sYW4gZGVwdGhsZXJpIGJ1bHVudXo/DQoNCmBgYHtyfQ0KaGVhZChlbG1hcyAlPiUgc2VsZWN0KGNvbG9yLCBkZXB0aCkgJT4lIGZpbHRlcihjb2xvcj09IkoiKSkNCmBgYA0KDQpDdXQgZGXEn2nFn2tlbmluaSBrYXRlZ29yaWxlcmUgZ29yZSBkYWdpbGltaQ0KDQpgYGB7cn0NCmVsbWFzICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UoQWRldD1uKCkpDQpgYGANCg0KQ29sb3IgZGVnaXNrZW5pbmluIGthdGVnb3JpbGVyZSBnb3JlIGRhZ2lsaW1pDQoNCmBgYHtyfQ0KZWxtYXMgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKEFkZXQ9bigpKQ0KYGBgDQoNCkN1dCBkZWdpc2tlbmluaW4ga2F0ZWdvcmlsZXJlIGdvcmUgZGFnaWxpbWkNCg0KYGBge3J9DQplbG1hcyAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShBZGV0PW4oKSkNCmBgYA0KDQpDdXQgdmUgQ2xhcml0eSBkZWdpc2tlbmxlcmluaSBpa2lsaSBkYWdpbGltaQ0KDQpgYGB7cn0NCmVsbWFzICU+JSBncm91cF9ieShjdXQsIGNsYXJpdHkpICU+JSBzdW1tYXJpc2UoQWRldD1uKCkpDQpgYGANCg0KIyMgR3JhZmlrbGVyDQoNCiMjIyBQb2ludCBwbG90DQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcykrIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4PXByaWNlLHk9dGFibGUsY29sb3I9Y2xhcml0eSkpDQpgYGANCg0KIyMjIEJveCBQbG90DQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcykrZ2VvbV9ib3hwbG90KG1hcHBpbmcgPSBhZXMoeD1jbGFyaXR5LCB5PXRhYmxlLCBjb2xvcj1jbGFyaXR5KSkNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KZ2dwbG90KGRhdGE9ZWxtYXMpK2dlb21fYm94cGxvdChtYXBwaW5nID0gYWVzKHg9Y3V0LCB5PXRhYmxlLCBjb2xvcj1jdXQpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcykrZ2VvbV9ib3hwbG90KG1hcHBpbmcgPSBhZXMoeD1jb2xvciwgeT10YWJsZSwgY29sb3I9Y29sb3IpKQ0KYGBgDQoNCiMjIyBIaXN0b2dyYW0NCg0KYGBge3IsIGVjaG89VH0NCg0KZ2dwbG90KGRpYW1vbmRzLGFlcyh4ID0gY3V0LCBmaWxsID0gY3V0KSkgKyANCiAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSkpKyBnZW9tX3RleHQoYWVzKHk9KC4uY291bnQuLiksIHZqdXN0ID0gLTAuNSwgbGFiZWwgPSBpZmVsc2UoKC4uY291bnQuLik9PSAwICwiIiwgc2NhbGVzOjpwZXJjZW50KCguLmNvdW50Li4pL3N1bSguLmNvdW50Li4pKSkpLCBzdGF0ID0gImNvdW50IikrDQogIGxhYnMoIHggPSAiRWxtYXNsYXLEsW4ga2VzaW0gdMO8csO8IiwNCiAgICAgICAgeSA9ICJGcmVrYW5zbGFyIiwNCiAgICAgICAgdGl0bGUgPSAiS2VzaW1sZXJpbmUgZ8O2cmUgZWxtYXMgdMO8cmxlcmkiKQ0KIA0KYGBgDQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcyxhZXMoeD1wcmljZSkpK2dlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxjb2xvcj0iQmxhY2siLCBmaWxsPSJCbHVlIikrZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KZ2dwbG90KGRhdGE9ZWxtYXMsYWVzKHg9ZGVwdGgpKStnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sb3I9IkJsYWNrIiwgZmlsbD0iUmVkIikrZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KZ2dwbG90KGRhdGE9ZWxtYXMsYWVzKHg9Y2FyYXQpKStnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sb3I9IkJsYWNrIiwgZmlsbD0iUHVycGxlIikrZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KDQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArIA0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIGZpbGwgPSBjbGFyaXR5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcykrIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeD1jdXQsIGZpbGw9Y2xhcml0eSkpDQpgYGANCg0KYGBge3IsIGVjaG89VH0NCmdncGxvdChkYXRhPWVsbWFzKSsgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4PWN1dCwgZmlsbD1jbGFyaXR5KSxwb3NpdGlvbiA9ICJmaWxsIikNCmBgYA0KDQojIyMgUGFzdGEgR3JhZmnEn2kNCmBgYHtyLCBlY2hvPVR9DQoNCmdncGxvdChkaWFtb25kcyxhZXMoeCA9ICIiLCBmaWxsPWNsYXJpdHkpKSArIA0KICBnZW9tX2Jhcih3aWR0aCA9IDEpICsgDQogIGNvb3JkX3BvbGFyICh0aGV0YT0ieSIpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KDQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArIA0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIGZpbGwgPSBjdXQpLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCB3aWR0aCA9IDEpICsgDQogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpICsNCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpKyANCiAgY29vcmRfZmxpcCgpKyANCiAgY29vcmRfcG9sYXIoKQ0KDQpgYGANCg0KIyMjIDNEIFBsb3QNCg0KYGBge3J9DQoNCnBsb3RfbHkoZGlhbW9uZHMsIHggPSB+Y2FyYXQsIHkgPSB+ZGVwdGgsIHogPSB+dGFibGUsIGNvbG9yID0gfmNvbG9yLCBjb2xvcnMgPSBjKCcjQkYzODJBJywgJyMwQzRCOEUnKSkgJT4lDQogIGFkZF9tYXJrZXJzKCkgJT4lDQogIGxheW91dChzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ2NhcmF0JyksDQogICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnZGVwdGgnKSwNCiAgICAgICAgICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICd0YWJsZScpKSkNCg0KDQpgYGANCg==